
public class posicion {
	
	private int x ;
    private int y ;
    private int valorHeu;
    private int camino;
    private int total;
    
    posicion(){
        x = -1;
        y = -1;
        valorHeu = 0;
        camino = 1;
        total = 0;
    }
    
     posicion(int a, int b){
        x = a;
        y = b;
        
    }
     
      posicion(int a, int b, int c){
        x = a;
        y = b;
        valorHeu = c;
    }
     
     posicion(posicion pos){
        x = pos.getPos_x();
        y = pos.getPos_y();
    }
     
     public void setPos(int a, int b){
        x = a;
        y = b;  
     }
    
     public int getPos_x(){
          return x;
     }
     
     public int getPos_y(){
          return y;
     }
     
     public boolean isEquals(posicion pos){
        if (pos.getPos_x() == x && pos.getPos_y()== y)
            return true;
        else
            return false;
     }
     
      public boolean isMayor(posicion pos){
        if (pos.get_heu() <= valorHeu)
            return true;
        else
            return false;
     }
     
     public void setHeu (int heu){
         valorHeu = heu;
     }
     public int get_heu(){
          return valorHeu;
     }
     
     public void setCamino (int cam){
         camino = cam;
     }
     public int get_Camino(){
          return camino;
     }
     
     public void setTotal (){
         total = valorHeu + camino;
     }
     public int get_Total(){
          return total;
     }
     
     public void calculo_manhattan(posicion objetivo){
        
        //el valor heuristico sera la distancia hasta el obejtivo en casillas
        valorHeu = (Math.abs(x - objetivo.getPos_x())) + (Math.abs(y - objetivo.getPos_y()));
        //se hace en valor absoluto para no tener negativos  
    }
     
     public void calculo_euclidiano(posicion objetivo){
        
        //el valor heuristico sera la distancia hasta el obejtivo en casillas
         int p,q;
         p = (int) Math.pow((x - objetivo.getPos_x()),2);
         q = (int) Math.pow((y - objetivo.getPos_y()),2);
         valorHeu = (int) Math.sqrt(p+q) ;
        //se hace en valor absoluto para no tener negativos
  
    }
     
     public void calculo_cuadrada(posicion objetivo){        
        //http://www.oocities.org/valcoey/cellular.html
         valorHeu = (int)Math.max(Math.abs(x-objetivo.getPos_x()),Math.abs(y-objetivo.getPos_y()));
  
    }     

     public void calculo_camberra(posicion objetivo){    
         int valor;
         if (((Math.abs(x - objetivo.getPos_x())) + (Math.abs(y - objetivo.getPos_y()))) == 0 )
             valor = 1;
         else
             valor = (Math.abs(x - objetivo.getPos_x())) + (Math.abs(y - objetivo.getPos_y()));
         
         valorHeu = Math.abs((Math.abs(x - objetivo.getPos_x())) - (Math.abs(y - objetivo.getPos_y())))/valor;
  
    }      
     
     
     public int compareTo(Object o) {
        posicion pos = (posicion)o;
        if(this.total < pos.get_Total())
            return -1;
        else if(this.total == pos.get_Total())
            return 0;
        else
            return 1;
}

}
